

Public MustInherit Class BaseExpression
    Private _Left As Object
    Private _Right As Object
    Private _Op As Object
    Public Overridable Property Left() As Object
        Get
            Return _Left
        End Get
        Set(ByVal value As Object)
            _Left = value
        End Set
    End Property
    Public Overridable Property Right() As Object
        Get
            Return _Right
        End Get
        Set(ByVal value As Object)
            _Right = value
        End Set
    End Property

    Public Overridable Property Op() As Object
        Get
            Return _Op
        End Get
        Set(ByVal value As Object)
            _Op = value
        End Set
    End Property
End Class

Public Class PredicateExpression
    Inherits BaseExpression

    Public Sub New()

    End Sub
    Public Sub New(ByVal left As String, ByVal right As String, ByVal op As Operators)
        Me.Left = left
        Me.Right = right
        Me.Op = op
    End Sub
    Public Overloads Property Left() As String
        Get
            Return MyBase.Left
        End Get
        Set(ByVal value As String)
            MyBase.Left = value
        End Set
    End Property

    Public Overloads Property Right() As String
        Get
            Return MyBase.Right
        End Get
        Set(ByVal value As String)
            MyBase.Right = value
        End Set
    End Property

    Public Overloads Property Op() As Operators
        Get
            Return MyBase.Op
        End Get
        Set(ByVal value As Operators)
            MyBase.Op = value
        End Set
    End Property

End Class

Public Class LogicalExpression
    Inherits BaseExpression
    Public Overloads Property Left() As BaseExpression
        Get
            Return MyBase.Left
        End Get
        Set(ByVal value As BaseExpression)
            MyBase.Left = value
        End Set
    End Property

    Public Overloads Property Right() As BaseExpression
        Get
            Return MyBase.Right
        End Get
        Set(ByVal value As BaseExpression)
            MyBase.Right = value
        End Set
    End Property

    Public Overloads Property Op() As BooleanOperators
        Get
            Return MyBase.Op
        End Get
        Set(ByVal value As BooleanOperators)
            MyBase.Op = value
        End Set
    End Property
End Class

Public Enum BooleanOperators
    None
    [Or]
    [And]
    [Not]
End Enum
Public Enum Operators
    Equals
    GreaterThan
End Enum